﻿#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <unordered_set>
using namespace std;


/*

https://leetcode.cn/problems/path-sum-iii/

给定一个二叉树的根节点 root ，和一个整数 targetSum ，求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始，也不需要在叶子节点结束，但是路径方向必须是向下的（只能从父节点到子节点）。

 

示例 1：
输入：root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出：3
解释：和等于 8 的路径有 3 条，如图所示。

示例 2：
输入：root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出：3
 

提示:
二叉树的节点个数的范围是 [0,1000]
-109 <= Node.val <= 109 
-1000 <= targetSum <= 1000 
*/


 struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};


 class Solution {
 public:
     int pathSum(TreeNode* root, int targetSum) {
         unordered_map<int, int> worker;
         ++worker[0];
         int res = 0;
         dfs(root, 0, worker, res, targetSum);
         return res;
     }

 private:
     void dfs(TreeNode* root, int preSum, unordered_map<int, int>& worker, int& res, int target) {
         if (!root) return;
         preSum += root->val;
         res += worker[preSum - target];
         ++worker[preSum];
         dfs(root->left, preSum, worker, res, target);
         dfs(root->right, preSum, worker, res, target);
         --worker[preSum];
     }
 };




int main() {
    Solution s;
    TreeNode* root = new TreeNode(1);

    cout << s.pathSum(root, 1);

    return 0;
}